/*
 * Copyright (c) 2014 pkzd/1.0, 颜文泽(robin)
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *     1 Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     2 Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include	<param.h>

.globl save
save:
	cli
	pushl	%edx
	movl	0x08(%esp), %eax
	movl	0x04(%esp), %edx
	movl	%edx, -0x04(%eax)
	movl	%edi, -0x08(%eax)
	movl	%esi, -0x0c(%eax)
	movl	%ebx, -0x10(%eax)
	movl	%ebp, -0x14(%eax)
	movl	$0,   -0x18(%eax)
	popl	%edx
	ret
	
.globl longjmp
longjmp:
	movl	0x04(%esp), %esp
	addl 	0x04, %esp
	movl	$0xffffffff, %eax
	ret
.globl save_exec
save_exec:
	movl	0x04(%esp), %eax	/* esp */ 
	movl	0x08(%esp), %edx	/* eip */
	pushl	$(USER_DSEL)
	pushl	%eax
	pushfl
	pushl	$(USER_CSEL)		
	pushl	%edx
	movw	$(USER_DSEL), %ax
	movw	%ax, %ds
	movw	%ax, %es
	iret
.globl flush_tbl
flush_tbl:
	pushl	%eax
	movl	%cr3, %eax
	movl	%eax, %cr3
	popl	%eax
	ret
.globl regain
regain:
	movl	0x4(%esp), %edi
	movl	0x8(%esp), %esi
	movl	0xc(%esp), %eax
	movl	$(PAGESIZ), %ecx
	cld
	rep	movsb
        movl    %eax, %esp
        popl    %eax
        popl    %ebp
        popl    %ebx
        popl    %esi
        popl    %edi
	sti
        ret
